//acw

//https://www.acwing.com/problem/content/1462/


//二分 or 暴力



// #include<bits/stdc++.h>
// using namespace std;
// #define all(x) (x).begin(),(x).end()
// #define rall(x) (x).rbegin(),(x).rend()
// const int N=2e5+10;
// #define INF 0x3f3f3f3f;
// typedef long long int ll;
// #define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
// //----------------------------------------------------------------------------//
// int n;
// string str;

// int main()
// {
//     cin >> n >> str;

//     for (int k = 1; k <= n; k ++ )
//     {
//         bool flag = false;
//         for (int i = 0; i + k - 1 < n; i ++ )
//         {
//             for (int j = i + 1; j + k - 1 < n; j ++ )//从i+1开始,前面的i-1和i在前面的遍历中已经实验过了
//             {
//                 bool same = true;
//                 for (int u = 0; u < k; u ++ )
//                     if (str[i + u] != str[j + u])
//                     {
//                         same = false;
//                         break;
//                     }
//                 if (same)
//                 {
//                     flag = true;
//                     break;
//                 }
//             }
//             if (flag) break;
//         }

//         if (!flag)
//         {
//             cout << k << endl;
//             break;
//         }
//     }

//     return 0;
// }



#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N=2e5+10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
//满足不满足,二段性,当mid合法,那大于mid的就不满足,再去小于mid的去找
int n;
string s;
unordered_set<string> st;

bool check(int mid)
{
	st.clear();
	for(int i=0;i+mid-1<n;i++)//hash就不用屑三个for了
	{
		string t=s.substr(i,mid);
		if(st.count(t)) return false;
		st.insert(t);
	}
	return true;
}

int main()
{
	close();
	cin>>n>>s;

	int l=1,r=n;//二分出的mid是字符串的长度
	while(l<r)//找满足的最左边,让r靠近左边
	{
		int mid=l+r>>1;
		if(check(mid)) r=mid;//满足就让r更新,让r跟靠近左边
		else l=mid+1;//不满足才让l更新
	}
	
	cout<<l<<'\n';
	return 0;
}